package cn.edu.zsc.rbac.dao.collection;

import cn.edu.zsc.rbac.dao.IBaseDao;
import cn.edu.zsc.rbac.domain.entity.BaseEntity;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

abstract class BaseDao<Entity extends BaseEntity> implements IBaseDao<Entity> {
    /**
     * 实体对象存储容器
     */
    Map<Integer, Entity> data = new HashMap<>();
    /**
     * ID 计数器
     */
    int idCounter = 1;
    @Override
    public boolean existsById(int id) {
        return data.containsKey(id);
    }
    @Override
    public Entity findById(int id) {
        return data.get(id);
    }
    @Override
    public Collection<Entity> list() {
        return data.values();
    }
    /**
     * 保存⼀个实体，如果实体没有设置 id，则⾃动⽣成⼀个新的 id 并保存该实体。
     *
     * 如果传⼊的实体没有设置 id，则会⾃动分配⼀个唯⼀的 id，通常是递增的计数值。
     * 该实体会被存储到数据结构（例如 `data`）中，若已存在相同 id 的实体则会覆盖。
     *
     * @param entity 要保存的实体对象，包含需要保存的属性。该实体必须是继承⾃ {@link
    BaseEntity} 的类型。
     * @return 保存后的实体对象，包含更新后的 id 值。
     */
    @Override
    public Entity save(Entity entity) {
        Integer id = entity.getId();
        // 如果实体没有 id，则⽣成⼀个新的 id
        if(id == null) {
            id = idCounter++;
            entity.setId(id); // 注意：这⾥必须设置实体对象的 id 值，需要修改BaseEntity, 提供 setId ⽅法。
        }
        // 将实体存⼊数据结构中
        data.put(id, entity);
        return entity;
    }
    @Override
    public Entity delete(int id) {
        return data.remove(id);
    }
}
